package br.com.paulo.compra;

import java.util.Date;
import java.util.List;
import java.util.Random;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

import br.com.paulo.util.PersisteHibernate;

public class CompraDAO extends PersisteHibernate {
		
	public static Produto getProduto(int id) {
		Produto produto = PersisteHibernate.getEntityManager().find(Produto.class, id);
		return produto;
	}
	
	public static void listarProdutos() {
		Query query = PersisteHibernate.getEntityManager().createNamedQuery("Produto.findAll");
		List<Produto> produtos = query.getResultList();
		for(Produto p : produtos) {
			System.out.println(p);			
		}			
	}
	
	public static void listarProdutosByIdPedido(int id) {
		Query query = PersisteHibernate.getEntityManager().createNamedQuery("Pedido.getProdutosByIdPedido");
		query.setParameter("id", id);
		query.setFirstResult(1);
		query.setMaxResults(3);
		List<Object[]> objects = query.getResultList();
		for(Object[] o : objects) {
			System.out.println(o[0]);
			System.out.println(o[1]);
		}			
	}
	
	public static void buscaPorNome(String nome) {
		Query query = PersisteHibernate.getEntityManager().createNamedQuery("Produto.findByName");
		query.setParameter("nome", nome);		
		List<Produto> produtos = query.getResultList();
		for(Produto p : produtos) {
			System.out.println(p);			
		}	
	}
	
	public static void contabilizaProdutos() {
		TypedQuery<Long> query = PersisteHibernate.getEntityManager().createNamedQuery("Produto.count", Long.class);
		Long count = query.getSingleResult();
		System.out.println(count);
	}
		
	public static void removeProduto(int idProduto) {
		Produto produto = getProduto(idProduto);
		PersisteHibernate.getEntityManager().remove(produto);
	}
	
	public static void insereProduto(Produto produto) {
		PersisteHibernate.getEntityManager().persist(produto);
	}
		
	public static void createPersisteBean(int idNota) {
		Pedido pedido = new Pedido();
		for (int i=1; i < 5; i++) {
			Produto produto = getProduto((new Random().nextInt(4) + 1));
			pedido.setIdNota(idNota);
			pedido.setDatacompra(new Date(System.currentTimeMillis()));
			pedido.getProdutos().add(produto);
			
		}
		EntityManager manager = PersisteHibernate.getEntityManager();
		manager.getTransaction().begin();
		manager.persist(pedido);
		manager.getTransaction().commit();
	}
	
	public static void modificaProduto(int id) {
		EntityManager manager = getEntityManager();
		manager.getTransaction().begin();
		Produto produto = manager.find(Produto.class, id);
		System.out.println(produto.toString());
		produto.setDeProduto("ceva");
		manager.getTransaction().commit();
		Produto produtoMod = manager.find(Produto.class, id);
		System.out.println(produto.toString());	
	} 
	
	public static void concorrenciaTeste() {
		try {
			EntityManager entity = getEntityManager();
			entity.getTransaction().begin();
			EntityManager entity2 = getEntityManager();
			entity2.getTransaction().begin();
			Pedido pedido = entity.find(Pedido.class, 1);
			Pedido pedido2 = entity2.find(Pedido.class, 1);		
			pedido2.setIdNota(10);
			pedido.setIdNota(100);
			entity.getTransaction().commit();
			entity2.getTransaction().commit();
			entity.close();
			entity2.close();			
		} catch (Exception e) {
			EntityManager entity3 = getEntityManager();
			entity3.getTransaction().begin();
			Pedido pedido3 = entity3.find(Pedido.class, 1);
			pedido3.setIdNota(0);
			entity3.merge(pedido3);
			entity3.getTransaction().commit();
			entity3.close();
		}
	}
	
	public static void criteriaListaNome() {
		EntityManager manager = PersisteHibernate.getEntityManager();
		CriteriaBuilder cd = manager.getCriteriaBuilder();
		CriteriaQuery<String> cq = cd.createQuery(String.class);
		Root<Produto> produto = cq.from(Produto.class);
		cq.select(produto.<String>get("deProduto"));
		TypedQuery<String> query = manager.createQuery(cq);
		List<String> result = query.getResultList();		
		for (String nome : result) {
			System.out.println(nome);
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
	//	modificaProduto(1);
	//	buscaPorNome("ceva");
	//	createPersisteBean(2);
		
	//	listarProdutosByIdPedido(1);
		
		criteriaListaNome();

	}

}
